package service;

import java.sql.SQLException;


import dataConnector.Connector;
import dataDAOImpl.MySQLOperatorDAO;
import dataDAOInterfaces.DALException;
import dataDAOInterfaces.IOperatorDAO;


public class ValidateInput 
{
	private String error = "";

	public boolean validate(String id, String oprName, String cpr, String ini, String pass, boolean validatePattern)
	{
		//validatePattern bruges til at bestemme om der skal udskrives fejl hvis password ikke indeholder
		//de nødvendige tegn for et password. (false på 'login' siden og true på 'rediger' siden)
		error = "";
		if (id != null)
			validateId(id);

		if (oprName != null)
			validateOprName(oprName);

		if (cpr != null) 
			validateCpr(cpr);

		if (ini != null)
			validateIni(ini);

		if (pass != null)
			validatePass(pass, validatePattern);

		//Tjekker om validerignen har fejlet
		return (error.isEmpty());
	}

	//####################### ID VALIDERING #######################
	private void validateId(String id)
	{
		if (!id.matches("[0-9]+")) 
		{
			if (id.isEmpty()) 
			{
				error = error + "<li>Indtast operatør ID</li>";
			} 
			else 
			{
				error = error + "<li>Operatør ID skal være et tal</li>";
			}
		}
	}

	//###################### NAVN VALIDERING #####################
	private void validateOprName(String oprName)
	{
		if (!oprName.matches("^[A-Za-z ]+$") || oprName.length() < 2)
		{
			if (oprName.isEmpty()) 
			{
				error = error + "<li>Indtast navn</li>";
			}
			else
			{
				error = error + "<li>Navn skal indeholde min. 2 karakterer af bogstavene a-z</li>";
			}
		}
	}

	//###################### CPR VALIDERING ######################
	private void validateCpr(String cpr)
	{
		if (!cpr.matches("[0-9]+") || cpr.length() < 10) 
		{
			if (cpr.isEmpty()) 
			{
				error = error + "<li>Indtast CPR nummer</li>";
			} 
			else
			{
				error = error + "<li>CPR nummer skal være et tal indeholdende 10 karakterer</li>";
			}
		}
	}

	//################### INITIALER VALIDERING ###################
	private void validateIni(String ini)
	{
		if (!ini.matches("^[A-Za-z ]+$") || ini.length() < 2)
		{
			if (ini.isEmpty()) 
			{
				error = error + "<li>Indtast initialer</li>";
			}
			else
			{
				error = error + "<li>Initialer skal indeholde 2-3 karakterer af bogstavene a-z</li>";
			}
		}
	}

	//################### PASSWORD VALIDERING ####################
	private void validatePass(String pass, boolean validatePattern)
	{
		Password check = new Password();
		if (pass.isEmpty()) 
		{
			error = error + "<li>Indtast adgangskode</li>";
		} 
		else if (pass.length() < 7)
		{
			error = error + "<li>Adgangskode skal indeholde 7-8 karakterer</li>";
		}
		else if (!check.isPassLegal(pass))
		{
			if (validatePattern)
				error = error + "<li>Adgangskode overholder ikke de nødvendige kriterier</li>";
		}
	}

	public ErrorService createError(){
		ErrorService error = new ErrorService();
		return error; 
	}
	
	public void setError(String error)
	{
		this.error = error;
	}
	
	//######################### GETTERS ##########################
	public String getError(){
		return error;
	}

	public boolean validateCredentials(String id, String pass)
	{	
		try { new Connector(); } 
		catch (InstantiationException e) { e.printStackTrace(); }
		catch (IllegalAccessException e) { e.printStackTrace(); }
		catch (ClassNotFoundException e) { e.printStackTrace(); }
		catch (SQLException e) { e.printStackTrace(); }

		IOperatorDAO opr = new MySQLOperatorDAO();

		try
		{
			//Her tjekkes password og om operatøren er aktiv
			return opr.getOperator(Integer.parseInt(id)).getPassword().equals(pass) && opr.getOperator(Integer.parseInt(id)).getStatus().equals("1") ? true : false;
		}
		catch (DALException e)
		{
			System.out.println("DALException: "+e);
			return false;
		}
		catch (Exception e)
		{
			System.out.println("Exception: "+e);
			return false;
		}
	}

	//######################### SETTERS ##########################


}
